#include <iostream>
#include <string>
#include <mysql/mysql.h>

const std::string host = "127.0.0.1";
const std::string user = "zpl";
const std::string passwd = "12345";
const std::string db = "test_db";
const unsigned int port = 8080;

int main()
{
    // 通过API接口，查看一下我们使用的mysql client的版本
    std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;

    // 1. new Mysql对象
    MYSQL *my = mysql_init(nullptr);
    if (my == nullptr)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }

    // 2. 连接mysql服务
    if (mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "connect MySQL error" << std::endl;
        return 2;
    }
    // std::cout << "connect success" << std::endl;
    // 避免中文乱码 设置字符集为utf8
    mysql_set_character_set(my, "utf8");

    // std::string sql = "update user set telephone = '110' where name = '小张'";
    std::string sql = "select * from user";
    int n = mysql_query(my, sql.c_str());
    if (n == 0)
        std::cout << sql << " success: " << n << std::endl;
    else
    {
        std::cout << sql << " error: " << n << std::endl;
        return 3;
    }

    // 将句柄my查询的结果转储到MYSQL_RES 类型结构体 res中
    MYSQL_RES *res = mysql_store_result(my);
    // 判断是否转储失败
    if (res == nullptr)
    {
        std::cerr << "mysql store result error" << std::endl;
        return 4;
    }

    // 转储成功，将其当做一个char**的一个二维数组使用
    int rows = mysql_num_rows(res);     // 获取行数
    int fields = mysql_num_fields(res); // 获取列数

    std::cout << "行：" << rows << std::endl;
    std::cout << "列：" << fields << std::endl;

    // 属性
    MYSQL_FIELD *field_array = mysql_fetch_fields(res);
    for (int i = 0; i < fields; i++)
    {
        std::cout << field_array[i].name << "\t";
    }
    std::cout << std::endl;

    // 内容
    for (int i = 0; i < rows; i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res); // MYSQL_ROW其实就是char**类型  自动迭代下一行
        for (int j = 0; j < fields; j++)
        {
            std::cout << row[j] << "\t";
        }
        std::cout << std::endl;
    }
    // 查看使用的是哪一个数据库和表
    std::cout << field_array[0].db << "\t" << field_array[0].table << std::endl;
    // std::string sql;
    // while (true)
    // {
    //     std::cout << "MySQL>>";
    //     if (!std::getline(std::cin, sql) || sql == "quit")
    //     {
    //         std::cout << "bye bye" << std::endl;
    //         break;
    //     }
    //     // 执行读入的sql语句
    //     int n = mysql_query(my, sql.c_str());
    //     if (n == 0)
    //     {
    //         std::cout << sql << " success: " << n << std::endl;
    //     }
    //     else
    //     {
    //         std::cerr << sql << " error: " << n << std::endl;
    //         break;
    //     }
    // }
    // 最后关闭
    mysql_close(my);
    return 0;
}